import os
import logging
import yaml
from typing import Dict, Any, Optional

# 日志设置
def setup_logging(
    log_file: str = "app.log",
    log_level: int = logging.INFO,
    log_format: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
):
    """
    设置日志记录。
    """
    logging.basicConfig(
        filename=log_file,
        level=log_level,
        format=log_format,
    )
    return logging.getLogger(__name__)

# 文件路径操作
def get_project_root() -> str:
    """
    获取项目的根目录。
    """
    return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 类型转换
def convert_to_int(value: Any, default: int = 0) -> int:
    """
    将值转换为整数，失败时返回默认值。
    """
    try:
        return int(value)
    except (ValueError, TypeError):
        return default

# yaml 配置文件读取辅助函数       
def read_yaml_config(file_path: str) -> Dict[str, Any]:
    """
    读取 YAML 配置文件并返回解析后的字典。
    """
    if not os.path.exists(file_path):
        raise FileNotFoundError(f"配置文件 {file_path} 不存在")

    with open(file_path, "r", encoding="utf-8") as file:
        return yaml.safe_load(file)

# 从yaml配置文件中获取配置参数
def get_config(
    config_path: str = "config/config.yaml", 
    root_dir: Optional[str] = None
) -> Dict[str, Any]:
    """
    获取配置文件内容。
    如果 root_dir 未指定，使用项目的根目录。
    """
    if root_dir is None:
        root_dir = get_project_root()
    
    config_file = os.path.join(root_dir, config_path)
    return read_yaml_config(config_file)

# 
## 数据验证
def validate_data(data: Dict[str, Any], required_keys: list) -> bool:
    """
    验证数据是否包含所有必需的键。
    """
    for key in required_keys:
        if key not in data:
            logging.error(f"数据验证失败：缺少键 {key}")
            return False
    return True

## 其他通用函数 - 时间
def get_current_time() -> str:
    """
    获取当前时间（格式化为字符串）。
    """
    from datetime import datetime
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

## 其他通用函数 - url验证
def is_valid_url(url: str) -> bool:
    """
    验证 URL 是否有效。
    """
    try:
        from urllib.parse import urlparse
        result = urlparse(url)
        return all([result.scheme, result.netloc])
    except Exception as e:
        logging.error(f"URL 验证失败：{e}")
        return False